查看原文
其他

整理五万条银行流水居然只需要30s? |Dirty Work互助者计划

一直在努力的小邱 案牍AutoDocs 2023-02-11

// Dirty Work互助者计划

这里是AutoDocs新推出的专题栏目。


在这个专题栏目里面,我们将聚焦一些特定工作场景,分享一些有助于高效解决Dirty Work的小技巧。


希望在这些技巧的帮助下,大家可以提高自己的工作效率,早点下班!


本栏目中的内容来源主要包括AutoDocs团队成员、AutoDocs交流群内的群友交流讨论内容


同时,我们也欢迎读者们的来稿,稿件一经录用,都有相应的奖励!



本文由AutoDocs超级厉害的实习生

@一直在努力的小邱 授权发布|

感谢作者为AutoDocs提供优质原创内容|



本文共计约2,400字,建议阅读时间7分钟。


Excel表格匹配是我们处理银行流水过程中经常需要处理的工作。


但是表格的格式、内容并不是固定且完全一致的。


本篇推送,将介绍正则表达式的用法,并通过实战演练,教你如何快速上手,轻松解决Dirty Work!


某天起床,我收到了小伙伴的一条求助信息,问我:


“Excel表格匹配怎么做?”


我心里想:这很简单啊!

VLOOKUP函数不就解决了吗?


但听他描述完整个问题后,我整个人都傻了…



概括一下这位求助者的问题:


要把银行日记账和流水账按照时间、金额、对方户名一一匹配,如果只是采取普通加辅助列整理出来的只能将时间和金额匹配起来,但是却没办法匹配到对方户名。


对账是要将相同时间、相同账户、相同金额的记录在两个工作表中进行匹配


但我们经常会遇到的情况是:现金日记账里只有摘要,但没有银行账户这个关键信息。


首先,我们来观察银行流水账现金日记账两张表格的结构:


表1:银行流水账


表2:现金日记账


✅ 时间

✅ 金额

💡满足两个条件可以通过辅助列来完成匹配


但账户名怎么关联?


银行流水账有账户名这个关键字,但是现金日记账里却没有,怎么处理?


你可能会说:


“嘿嘿,分列不就解决了?用分隔符"-"对日记账的摘要进行分列操作,再用VLOOKUP匹配,轻松解决问题。”



但真实情况的表格一般如下所示:



表述五花八门,格式乱七八糟


不过上面的解决思路上有一点是对的:

要将摘要进行分列,提取出银行账户名


不过怎么确定在哪个位置进行分割提取关键信息呢?


Excel的分列功能面对形形色色的表述爱莫能助,

Power Query的分列好像也不太适用。


面对这种棘手的情况,我们可以借助正则表达式呀!


// 什么是正则表达式?

正则表达式(regular expression):是一种描述字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。


例如:autodoc+s,可以匹配 autodocs、autodoccs、autodoccccccs 等,+ 号代表前面的字符必须至少出现一次


因此,正则表达式可以简单粗暴地理解为一种匹配方法:


我们告诉计算机一段内容的内在规律(比如说手机号的11位数字)和我们需要的内容结构,计算机将会帮我们去做相应的匹配,并将找到的结果返还给我们。


相比之下,VLOOKUP的局限性在于


只能告诉计算机:“帮我找Andy这个单词”,而不能跟计算机说:“帮我找出所有A开头的单词。”


划重点:正则表达式不是一个具体的内容,它是一个抽象的规律。


正则表达式的基本语法:正则表达式一个字符代表一个位置,一组[]代表一个范围,一组{}代表字符出现次数。


下面匹配日期为例进行操作演示,试试我们刚学会的正则表达式。



基于不同的记录习惯,我们在Excel表中遇到各种各样的情况。看看上面的日期写法,#¥@%&*……。


如果让Excel自动提取每一个单元格里的日期内容,估计Excel都会崩溃。


那么我们人类又是怎么认出这些日期的呢?


因为我们知道,一般四个数字表示年份,两个数字的表示月份或者日号,中间加一些停顿符号或者文字分隔符,继而读出了具体的日期。


那我们就把这个内在的规律通过代码形式体现出来!


第一步:提取年份


年份的取值是由四个数字构成的,数字的取值范围是0-9,取值范围用[],字符出现次数用{},因此年份的正则表达式可以写为


[0-9] {4}

👇🏻


等下,年份可能只有两位数字!


所以年份的规律应该是,最少2个数字,最多4个数字!跟字符出现次数有关的,还是用{},可是怎么写呢?


[0-9]{2,4}表示,0-9范围内的数字最少出现两次,最多出现四次。


所以{}内的参数可有两个,逗号前的参数表示最少出现的次数,逗号后的参数表示最多出现的次数。


如果{}内参数只有一个,则表示出现的固定次数。



第二步:提取月份


根据大家的习惯,年份后面会出现天然的文字分隔符。


比如“年”、“/”、“-”或者“.”等符号,也就是说年份后面紧跟的字符是这几个字符中的某一个,用[]限定范围就可以啦!


注意,这里需要把'-'放在最后,否则会出错,因为'-'放在两个字符中间表示“至”的意思,0-9,0至9。因此如果要表示'-'字符本身,要把'-'放在最后,防止误会~


[0-9]{2,4}[年./-]

👇🏻


第三步:提取日期


我们已经提取了月份前面的所有内容啦,顺着这个思路一口气把月份和日号也拿下吧!


[0-9]{2,4}[年./-][0-9]{2}[月./-][0-9]{1,2}[日号]

👇🏻


咦,“21年12.12”没有高亮,为什么?


因为我们告诉计算机,最后一个字符是日或者号里面的其中一个,而21年12.12的结尾并不是“日”或者“号”那该怎么办呢?


实际上我们想表达的是,如果最后一位有字符就是在日和号里面二选一,没有也行。用{0,1}表达出现次数就好啦


[0-9]{2,4}[年./-][0-9]{2}[月./-][0-9]{1,2}[日号]{0,1}

👇🏻


第四步:简化表达式


你看现在的这个表达式是不是有点冗长呢?


悄悄告诉你,正则表达式中含有丰富的元字符,我们可以直接用这些元字符代替



这时,上述日期的正则表达式可以简化为:


\d{2,4}[年月日号./-]\d{0,2}[月日号./-]?\d{0,2}[月日号./-]?

👇🏻


看似复杂的正则表达式,其实也没有想象中那么难对吧!


// 实战演练


回到文章开头提出的问题,这五万多条数据看起来就很乱


那要怎么通过正则表达式怎么快速提取出人名和公司名呢?


不难发现,即便每个人的表达习惯不一样


一个完整的语句会包括主体、事件、对象这些基本要素



针对上述要素描述,我们可以试着找到一些内在规律


人名前面可能会有其所属部门名称(xx部、BP中心-xx、xxxx项目组)


正则表达式:


'^.{1,3}部|组'


公司名前面可能会有“-”,且公司名的结尾都是“公司”(受篇幅的限制,数据只展示了一部分,法人名称结尾一般是“公司”或者“企业”字样)


正则表达式:


'-.+(公司)|(企业)$'


摘要中的动词大多为“支付”、“报销”、“申请”,而动词前面基本是人名

费用名称一般为“转移费”、“快递费”、“工程款”,即xx费,xx款


正则表达式:


'(支付)|(报销)|(申请)','.+[费款]'




Tada!


最后将选中的文本一键替换为空值就成功“清洗”出了我们想要的数据啦~



感谢看到这里,不知道有没有学会呢?


如果刚好遇到需要整理数据的情况就立马应用起来吧!


之后我们会继续在Dirty Work互助者栏目中分享更多让大家高效解决Dirty Work的外挂秘籍,也欢迎加入AutoDocs交流群,和我们一起探索更多提高工作效率的小技巧!


后台回复加群获得小助理的联系方式,拉你进AutoDocs交流群!




如果你觉得实用,就点一个“在看”吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存